/** 请求后端公共请求头*/
function requestDTO(obj) {
    var header = {
        appName: "gps-server",
        dataTime: new Date().getTime(),
        user: '',
        language: 'ZH_CN',
        serviceName: '',
        versionId: 'v0.1',
        token: null
    };
    var data = {
        header: header,
        body: obj
    };
    return JSON.stringify(data);
}

/**加载遮罩*/
function showLoad() {
    return layer.load(0, {shade: [0.5, '#666c7f']});
}

/**关闭遮罩*/
function closeLoad(index) {
    layer.close(index);
}

/**遮罩执行成功*/
function showSuccess() {
    layer.msg('执行成功！', {time: 1000, offset: 'auto'});
}

/**判断是否为空*/
function isEmpty(obj) {
    return typeof obj == "undefined" || obj == null || obj === "";
}

/**
 * 根据dataType获取数据字典
 */
function getDataDictionary(dataType) {
    var dictionaryList = layui.data('DataDictionary');
    return dictionaryList[dataType];
}

/**
 * 根据dataType设置option
 */
function addOption(target, dataType, flag) {
    // 先清空掉之前的选项
    target.find("option").remove();
    // 如果为true则显示请选择选项
    if (flag) {
        target.append(new Option());
    }
    // 查询数据字典，并赋值option
    var labelList = getDataDictionary(dataType);
    $.each(labelList, function (index, item) {
        target.append(new Option(item.label, item.value));
    });
}

/**
 * 根据dataType和value获取对应label
 */
function getLabel(dataType, value) {
    var label = "";
    // 查询数据字典，并赋值option
    var labelList = getDataDictionary(dataType);
    $.each(labelList, function (index, item) {
        if (item.value == value) {
            label = item.label;
            // 跳出循环。return false;——跳出所有循环；相当于 javascript 中的 break 效果。return true;——跳出当前循环，进入下一个循环；相当于 javascript 中的 continue 效果
            return false;
        }
    });
    return label;
}

// 数据字典类型
var DataType = {
    // 发送状态
    SendStatus: 3,
    // 路线状态
    RouteState: 4,
    // 模式
    Mode: 5
};

/*
* 将{id: xx, pid: xx} 转成 {id: xx, pid: xx, children: {}} 的形式
*/
function listToTree(data, options) {
    if (data && data.length) {
        options = options || {};
        var ID_KEY = options.idKey || 'id';
        var PARENT_KEY = options.parentKey || 'pid';
        var CHILDREN_KEY = options.childrenKey || 'children';
        var tree = [];
        var childrenOf = {};
        var item, id, parentId;

        for (var i = 0, length = data.length; i < length; i++) {
            item = data[i];
            id = item[ID_KEY];
            parentId = item[PARENT_KEY] || 0;
            // 每行数据都可能存在子类
            childrenOf[id] = childrenOf[id] || [];
            // 初始化子类
            item[CHILDREN_KEY] = childrenOf[id];
            if (parentId != 0) {
                // 初始化其父的子节点
                childrenOf[parentId] = childrenOf[parentId] || [];
                // 把它推到父类下的children
                childrenOf[parentId].push(item)
            } else {
                tree.push(item)
            }
        }
        return tree
    } else {
        return []
    }
}

// 图标转换
function getIconPath(icon) {
    var iconPath = '';
    if (icon === 'icon-voucher') {
        iconPath = '../static/icon/voucher.png';
    } else if (icon === 'icon-site') {
        iconPath = '../static/icon/site.png';
    } else if (icon === 'icon-device') {
        iconPath = '../static/icon/device.png'
    }
    return iconPath;
}

// 是否展开
function expandFlag(level) {
    var isSpread = false;
    // 默认展开到第二个节点
    if (level === 1) {
        isSpread = true;
    }
    return isSpread;
}

/**
 * js实现post方式提交打开新窗口
 * @param URL
 * @param PARAMS
 */
function postOpenWindow(URL, PARAMS) {
    var temp_form = document.createElement("form");
    temp_form.action = URL;
    temp_form.target = "_blank";//打开新页面
    temp_form.method = "post";
    temp_form.style.display = "none";
    for (var x in PARAMS) {
        var opt = document.createElement("textarea");
        opt.name = x;
        opt.value = PARAMS[x];
        temp_form.appendChild(opt);
    }
    document.body.appendChild(temp_form);
    temp_form.submit();
}

//显示描述
function show_tips(t, message, color) {
    if (typeof layer != 'undefined') {
        layer.tips(message, t, {
            tips: [1, color],
            time: 3000
        })
    }
}

function show_tips_mode(t, message, color) {
    if (typeof layer != 'undefined') {
        layer.tips(message, t, {
            tips: [3, color],
            time: 3000
        })
    }
}


// js2Java
function js2Java(params) {
    if (typeof window.JsReceiver0 != 'undefined' && window.JsReceiver0.js2Java != 'undefined') {
        // 是大写的Java
        return window.JsReceiver0.js2Java(JSON.stringify(params));
    } else if (typeof parent.window.JsReceiver0 != 'undefined') {
        // 如果在iframe中的话，无法访问到window对象，得需要通过parent.window才行。
        return parent.window.JsReceiver0.js2Java(JSON.stringify(params));
    }
    return null;
}

/**
 * java2js (gps-client客户端调用js的方法)
 * 这里给index.html文件中的<iframe data-frameid=''/>添加了id属性， 把菜单的中文名称当做了id, <iframe data-frameid='' id='name'/>
 */
function java2js(params) {
    //console.log("java2js:" + JSON.stringify(params));
    // 解决存在这些字符无法识别的问题
    params = params.replace(/\n/g, "\\\\n").replace(/\r/g, "\\\\r").replace(/\t/g, "\\\\t");
    var obj = JSON.parse(params);
    // 需要先找到iframe才能调用里面的方法
    var windowProxy = document.getElementById("实时操作").contentWindow;
    switch (obj.method) {
        case "reloadPage":
            windowProxy.reloadPage();
            break;
        case "reloadCurrentRouteTable":
            windowProxy.reloadCurrentRouteTable();
            break
        case "reloadSendDataTable":
            windowProxy.reloadSendDataTable();
            break;
        case "setDisplayContent":
            windowProxy.setDisplayContent(obj.text, obj.color);
            break;
        case "setCourseContent":
            windowProxy.setCourseContent(obj.text, obj.color);
            break;
        case "setSendPortData":
            windowProxy.setSendPortData(obj.sendGPGLL, obj.sendGPRMC, obj.sendGPVTG, obj.sendGPGGA, obj.sendTime);
            break;
        default:
            break
    }
}

function isBlank(value) {
    return (value == undefined || value == null || value.trim() == '');
}

// 是否是整数
function isInteger(obj) {
    return obj % 1 === 0
}

// 获取小数点的个数
function getPointNums(number) {
    // 获取小数点的位置，也就是整数部分的个数
    var y = String(number).indexOf(".") + 1;
    // 长度减去整数部分的，就是小数部分的
    return String(number).length - y;
};

// 运行状态
const MODE_STATUS_RUN = 1;
const MODE_STATUS_PAUSE = 2;
const MODE_STATUS_STOP = 3;
// 运行模式
const MODE_NAVIGATION = 1;
const MODE_WANDER = 2;
const MODE_ANCHOR = 3;
const MODE_SINGLE_CIRCLE = 4;
// 是否
const YES_VALUE = 1;
const NO_VALUE = 2;

/**
 * 经度，正确性判断
 *
 * @param longitudeDegree 度数
 * @param longitudeMinute 分
 * @param tip             提示前缀
 * @return true通过校验，false未通过校验
 */
function checkLongitudeDegreeFormat(longitudeDegree, longitudeMinute, tip) {
    if (typeof tip == "undefined") {
        tip = "";
    }
    if (isBlank(longitudeDegree)) {
        layer.msg(tip + "经度不能为空！");
        return false;
    }
    if (!isInteger(longitudeDegree) || longitudeDegree < 0 || longitudeDegree > 180) {
        layer.msg(tip + "经度的\"度数\"范围是0-180, 并且必须是整数");
        return false;
    }
    // 经度的分如果不为空的话，需要判断格式是否正确
    if (!isBlank(longitudeMinute)) {
        // isNaN()的缺点就在于 null、空格以及空串会被按照0来处理
        if (isNaN(longitudeMinute) || longitudeMinute < 0 || longitudeMinute > 60) {
            layer.msg(tip + "经度的\"分\"范围是0-60, 并且必须是数字(最多支持5位小数)");
            return false;
        }
        // 分小数点最多5位
        if (getPointNums(longitudeMinute) > 5) {
            layer.msg(tip + "经度的\"分\"最大只能支持5个小数");
            return false;
        }
        // 如果经度度数是180度的话，则分不能有值
        if (longitudeDegree == 180) {
            layer.msg(tip + "经度的度数为180度时, \"分\"不能有值");
            return false;
        }
    }
    return true;
}

/**
 * 纬度，正确性判断
 *
 * @param latitudeDegree 度数
 * @param latitudeMinute 分
 * @param tip            提示前缀
 * @return true通过校验，false未通过校验
 */
function checkLatitudeDegreeFormat(latitudeDegree, latitudeMinute, tip) {
    if (typeof tip == "undefined") {
        tip = "";
    }
    if (isBlank(latitudeDegree)) {
        layer.msg(tip + "纬度不能为空！");
        return false;
    }
    if (!isInteger(latitudeDegree) || latitudeDegree < 0 || latitudeDegree > 90) {
        layer.msg(tip + "纬度\"度数\"范围是0-90, 并且必须是整数");
        return false;
    }
    // 纬度的分如果不为空的话，需要判断格式是否正确
    if (!isBlank(latitudeMinute)) {
        // isNaN()的缺点就在于 null、空格以及空串会被按照0来处理
        if (isNaN(latitudeMinute) || latitudeMinute < 0 || latitudeMinute > 60) {
            layer.msg(tip + "纬度的\"分\"范围是0-60, 并且必须是数字(最多支持5位小数)");
            return false;
        }
        // 分小数点最多5位
        if (getPointNums(latitudeMinute) > 5) {
            layer.msg(tip + "纬度的\"分\"最大只能支持5个小数");
            return false;
        }
        // 如果纬度度数是90度的话，则分不能有值
        if (latitudeDegree == 90) {
            layer.msg(tip + "纬度度数为90度, 则\"分\"不能有值");
            return false;
        }
    }
    return true;
}

/**
 * 获取经纬度特单形式的值
 *
 * @param degree 度数
 * @param minute 分
 * @return 诸如00°00.00000'的格式
 */
function getDegreeValue(degree, minute) {
    // 度数
    var result = degree + "°";
    if (!isBlank(minute)) {
        result = result + minute + "'";
    }
    return result;
}

/**
 * 回显经纬度的值
 *
 * @param value 值
 * @param degreeId 度数的id
 * @param minuteId 分数的id
 */
function echoDegreeValue(value, degreeId, minuteId) {
    var arr = value.split("°");
    $('#' + degreeId).val(arr[0]);
    if (!isBlank(arr[1])) {
        $('#' + minuteId).val(arr[1].split("'")[0]);
    }
}

/**
 * 切换模式
 *
 * @param selectMode
 * @param selectModeStatus
 * @param currentNavigationId
 * @param isChild 是否是子页面
 * @param byHand 是否手动模式
 */
function switchModeFunction(selectMode, selectModeStatus, currentNavigationId, isChild, byHand) {
    if (typeof selectMode == 'undefined' || typeof selectModeStatus == 'undefined') {
        layer.msg("参数错误！", {
            time: 3000
        });
        return false;
    }
    // 如果当前没有模式在运行的话
    if (currentNavigationId == null || currentNavigationId == '') {
        if (selectModeStatus == MODE_STATUS_PAUSE || selectModeStatus == MODE_STATUS_STOP) {
            layer.msg("您还没有启动航程，无法暂停或停止哦！", {
                time: 3000
            });
            return false;
        }
    }
    var massage = {
        mode: selectMode,
        modeStatus: selectModeStatus,
        byHand: byHand
    };
    // 如果是要停止的话，需要弹出确认提示
    if (selectModeStatus == MODE_STATUS_STOP) {
        // 这里重复代码不知道该怎么抽取出来。。
        layer.confirm('确定停止此次航程？您可以前往航行记录查看此次发送数据。', function (index) {
            $.ajax({
                url: ctx + '/navigation/switchMode',
                type: "POST",
                contentType: "application/json",
                dataType: "json",
                data: requestDTO(massage),
                beforeSend: function () {
                    this.layerIndex = showLoad();
                },
                complete: function () {
                    closeLoad(this.layerIndex);
                },
                success: function (data) {
                    if (data.result.code == 200) {
                        // 操作成功
                        layer.msg("操作成功");
                        // 延迟关闭
                        setTimeout(function () {
                            if (isChild) {
                                // 关闭所有弹窗
                                parent.layer.closeAll();
                                // 重新加载父窗口
                                window.parent.location.reload();
                            } else {
                                // 关闭所有弹窗
                                layer.closeAll();
                                // 重新加载窗口
                                window.location.reload();
                            }
                        }, 330);
                    } else {
                        layer.msg(data.result.message);
                    }
                },
                error: function (result) {
                    layer.msg("请求失败！");
                }
            });
        });
    } else {
        $.ajax({
            url: ctx + '/navigation/switchMode',
            type: "POST",
            contentType: "application/json",
            dataType: "json",
            data: requestDTO(massage),
            beforeSend: function () {
                this.layerIndex = showLoad();
            },
            complete: function () {
                closeLoad(this.layerIndex);
            },
            success: function (data) {
                if (data.result.code == 200) {
                    // 操作成功
                    layer.msg("操作成功");
                    // 延迟关闭
                    setTimeout(function () {
                        if (isChild) {
                            // 关闭所有弹窗
                            parent.layer.closeAll();
                            window.parent.location.reload();
                        } else {
                            // 关闭所有弹窗
                            layer.closeAll();
                            window.location.reload();
                        }
                    }, 330);
                } else {
                    layer.msg(data.result.message);
                }
            },
            error: function (result) {
                layer.msg("请求失败！");
            }
        });
    }
    return false;
}

// 单选框选中
function radioChecked(paramKey, paramValue) {
    if (!isBlank(paramValue)) {
        $("input[name=" + paramKey + "][value=" + paramValue + "]").prop("checked", "true");
    }
}